#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>

#define ERREUR(msg)		printf ("Erreur [%s:%d] : ", __FILE__, __LINE__);printf(msg);printf("\n");
#define ERREUR2(msg,params)	printf ("Erreur [%s:%d] : ", __FILE__, __LINE__);printf(msg,params);printf("\n");


int main( int argc, char *argv[] ){

	int fichier=0, i, dames, j;

	/* Si il y a un argument -h ou plus d'un */
	if( argc<2 || !strcmp(argv[1],"-h") ){

		printf("\nUsage:\n");
		printf("\t%s <Nombre de dames> [fichier de formules de cardinalite]\n", argv[0]);
		printf("Si aucun fichier est specifie on ecrit les formules dans la sortie standard\n");

		return 0;

	/* Si un fichier est specifie */
	}else if(argc>=3){

		/* on remplace l'entree standard par le fichier */
		if( (fichier = open(argv[2], O_WRONLY| O_CREAT, S_IRUSR|S_IWUSR )) == -1 ){

			ERREUR2("Ne peut creer le fichier \"%s\"", argv[3]);
			return 0;

		}

		if( dup2( fichier, fileno(stdout) ) == -1 ){

			ERREUR2("Ne peut rediriger le flux de \"%s\"", argv[3]);
			return 0;

		}
	
	}

	// tailles
	dames = atoi(argv[1]);

	if( dames == 0 ){
		printf("0 0\n");
		exit(0);
	}
	
	// generation
	printf("%i %i\n", (2*dames)+(2*((dames-1)+(dames-2))), dames*dames );

	/*** ON FIXE UNE DAME PAR LIGNE ***/
	// a chaque case
	for( i=0; i<dames; i++ ){

		printf("( 1, { ");

		// a chaque colonne
		for( j=0; j<dames-1; j++ ){

			printf("%i, ", (dames*i)+j+1 );

		}
		printf("%i ", (dames*i)+j+1 );
		printf("} )\n");

	}

	/*** MAXI UNE DAME PAR COLONNE ***/
	// une dame par ligne
	for( i=0; i<dames; i++ ){

		printf("( %i, { ", dames-1);

		// dans chaque ligne
		for( j=0; j<dames-1; j++ ){

			printf("-%i, ", (dames*j)+i+1 );

		}
		printf("-%i ", (dames*j)+i+1 );
		printf("} )\n");

	}
	/*** MAXI UNE DAME PAR DIAGONALE ***/
	/* 1ere moitie */
	for( i=1; i<dames; i++ ){

		printf("( %i, { ", i);

		// pour chaque case
		for( j=0; j<i; j++ ){

			/* on est sur la diagonale i colonne j ligne dame-j-1
			 */
			printf("-%i, ",  ((dames+1)*j)+dames-i );

		}
		printf("-%i ", dames*(i+1) );
		printf("} )\n");

	}

	/* 2e moitie */
	for( i=dames-2; i>0; i-- ){

		printf("( %i, { ", i);

		// pour chaque case
		for( j=0; j<i; j++ ){

			/* on est sur la diagonale i colonne j ligne dame-j-1
			 */
			printf("-%i, ",  ((dames-1-i)*dames)+1+(dames*j)+j );

		}
		printf("-%i ", (dames*dames)-(dames-1-i) );
		printf("} )\n");

	}

	/*** MAXI UNE DAME PAR ANTIDIAGONALE ***/
	/* 1ere moitie */
	for( i=1; i<dames; i++ ){

		printf("( %i, { ", i);

		// pour chaque case
		for( j=0; j<i; j++ ){

			/* on est sur la diagonale i colonne j ligne dame-j-1
			 */
			printf("-%i, ",  ((dames-1)*j)+i+1 );

		}
		printf("-%i ", (dames*i)+1 );
		printf("} )\n");

	}

	/* 2e moitie */
	for( i=dames-2; i>0; i-- ){

		printf("( %i, { ", i);

		// pour chaque case
		for( j=0; j<i; j++ ){

			/* on est sur la diagonale i colonne j ligne dame-j-1
			 */
			printf("-%i, ",  ((dames-i)*dames)+((dames-1)*j) );

		}
		printf("-%i ", ((dames-i)*dames)+((dames-1)*j) );
		printf("} )\n");

	}

	// deverouillage du fichier
	close( fichier );
	
	return 0;
}

